package com.me.singleton;

/**
 * @author inttom
 * @date 2022/2/10
 *
 * 优点:这种写法比较简单,在类装载的时候完成实例化,避免了线程同步问题
 * 缺点:在类装载的时候就完成实例化,没有达到懒加载(Lazy Loading)的效果,如果从始至终从未使用过这个实例,则会造成内存的浪费
 *
 * 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数是调用getInstance方法,但是导致类装载的原因
 * 有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时初始化instance就没有达到lazy loading 的效果
 *
 * 结论: 这种单例模式可用,可能造成内存浪费
 */
public class SingletonTest01 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();

        // 全部都是true
        System.out.println(instance == instance1);
        System.out.println(instance.hashCode() == instance1.hashCode());
        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}

/**
 * 饿汉式(静态变量)
 */
class Singleton {

    /**
     * 构造器私有化,外部不能new
     */
    private Singleton() {
    }

    /**
     * 本类内部创建对象实例
     */
    private static final Singleton instance = new Singleton();

    /**
     * 提供一个公有的静态方法,返回实例对象
     *
     * @return 实例对象
     */
    public static Singleton getInstance() {
        return instance;
    }
}
